package com.matrix.product.service;

import com.matrix.api.product.dto.ProductCategoryDTO;
import com.matrix.api.product.dto.ProductDTO;
import com.matrix.api.product.vo.ProductCategoryVO;
import com.matrix.api.product.vo.ProductVO;
import com.matrix.common.domain.PageResult;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author 有点甜
 * @since 2025/7/27
 */
public interface ProductService {

    /**
     * 创建菜品分类
     *
     * @param userId      用户id
     * @param categoryDTO 分类信息
     * @return 分类vo
     */
    ProductCategoryVO createCategory(Long userId, ProductCategoryDTO categoryDTO);

    /**
     * 更新菜品分类
     *
     * @param userId      用户id
     * @param categoryId  分类id
     * @param categoryDTO 分类信息
     * @return 分类vo
     */
    ProductCategoryVO updateCategory(Long userId, Long categoryId, ProductCategoryDTO categoryDTO);

    /**
     * 删除菜品分类
     *
     * @param userId 用户id
     * @return 分类vo
     */
    List<ProductCategoryVO> listCategories(Long userId);

    /**
     * 获取菜品分类详情
     *
     * @param userId     用户id
     * @param categoryId 分类id
     */
    void deleteCategory(Long userId, Long categoryId);

    /**
     * 创建菜品
     *
     * @param userId     用户id
     * @param productDTO 菜品信息
     * @return 菜品vo
     */
    ProductVO createProduct(Long userId, ProductDTO productDTO);

    /**
     * 更新菜品
     *
     * @param userId     用户id
     * @param productId  菜品id
     * @param productDTO 菜品信息
     * @return 菜品vo
     */
    ProductVO updateProduct(Long userId, Long productId, ProductDTO productDTO);

    /**
     * 获取菜品列表
     *
     * @param userId     用户id
     * @param pageNum    页码
     * @param pageSize   页大小
     * @param categoryId 分类id
     * @param name       菜品名称
     * @return 分页结果
     */
    PageResult<ProductVO> listProducts(Long userId, int pageNum, int pageSize, Long categoryId, String name);

    /**
     * 获取菜品详情
     *
     * @param userId    用户id
     * @param productId 菜品id
     * @return 菜品vo
     */
    ProductVO getProductDetails(Long userId, Long productId);

    /**
     * 删除菜品
     *
     * @param userId    用户id
     * @param productId 菜品id
     */
    void deleteProduct(Long userId, Long productId);

    /**
     * 获取商铺菜单
     *
     * @param shopId 商铺id
     * @return 菜单
     */
    List<ProductCategoryVO> getShopMenu(Long shopId);


    /**
     * 根据id列表获取菜品列表
     *
     * @param ids id列表
     * @return 菜品列表
     */
    List<ProductVO> getProductsByIds(List<Long> ids);

    /**
     * 批量更新菜品评分
     *
     * @param ratingsMap 菜品id和评分的map
     */
    void batchUpdateProductRatings(Map<Long, BigDecimal> ratingsMap);

    /**
     * 批量更新菜品月销量
     *
     * @param salesMap 菜品id和月销量的map
     */
    void batchUpdateMonthlySales(Map<Long, Integer> salesMap);
}
